{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python for Finance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Analyze Big Financial Data**\n",
    "\n",
    "O'Reilly (2014)\n",
    "\n",
    "Yves Hilpisch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img style=\"border:0px solid grey;\" src=\"http://hilpisch.com/python_for_finance.png\" alt=\"Python for Finance\" width=\"30%\" align=\"left\" border=\"0\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Buy the book ** |\n",
    "<a href='http://shop.oreilly.com/product/0636920032441.do' target='_blank'>O'Reilly</a> |\n",
    "<a href='http://www.amazon.com/Yves-Hilpisch/e/B00JCYHHJM' target='_blank'>Amazon</a>\n",
    "\n",
    "**All book codes & IPYNBs** |\n",
    "<a href=\"http://oreilly.quant-platform.com\">http://oreilly.quant-platform.com</a>\n",
    "\n",
    "**The Python Quants GmbH** | <a href='http://tpq.io' target='_blank'>http://tpq.io</a>\n",
    "\n",
    "**Contact us** | <a href='mailto:pff@tpq.io'>pff@tpq.io</a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pylab import plt\n",
    "plt.style.use('ggplot')\n",
    "import matplotlib as mpl\n",
    "mpl.rcParams['font.family'] = 'serif'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Finance and Python Syntax"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "uuid": "1447b7bb-ed26-4c0f-9e0f-222dfd5d0c9b"
   },
   "outputs": [],
   "source": [
    "S0 = 100.\n",
    "K = 105.\n",
    "T = 1.0\n",
    "r = 0.05\n",
    "sigma = 0.2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "uuid": "a95c7301-39f7-4d51-937a-334f051c2d9e"
   },
   "outputs": [],
   "source": [
    "from numpy import *\n",
    "\n",
    "I = 100000\n",
    "\n",
    "random.seed(1000)\n",
    "z = random.standard_normal(I)\n",
    "ST = S0 * exp(r * T + sigma * sqrt(T) * z)\n",
    "hT = maximum(ST - K, 0)\n",
    "C0 = exp(-r * T) * sum(hT) / I"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "uuid": "84aab05d-40de-4ef1-b3a8-eb08f86e1662"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Value of the European Call Option 9.149\n"
     ]
    }
   ],
   "source": [
    "print(\"Value of the European Call Option %5.3f\" % C0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Time-to-Results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "uuid": "e16924db-8402-4bcb-a9c7-d5753346c72a"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "uuid": "22071d72-094b-4b51-aa39-cfa793d58623"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Close</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Date</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2017-10-25</th>\n",
       "      <td>972.91</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-10-26</th>\n",
       "      <td>972.43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-10-27</th>\n",
       "      <td>1100.95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-10-30</th>\n",
       "      <td>1110.85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2017-10-31</th>\n",
       "      <td>1105.28</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              Close\n",
       "Date               \n",
       "2017-10-25   972.91\n",
       "2017-10-26   972.43\n",
       "2017-10-27  1100.95\n",
       "2017-10-30  1110.85\n",
       "2017-10-31  1105.28"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# data from Thomson Reuters Eikon API\n",
    "raw = pd.read_csv('source/tr_eikon_eod_data.csv',\n",
    "                   index_col=0, parse_dates=True)\n",
    "amzn = pd.DataFrame(raw['AMZN.O'])\n",
    "amzn.columns = ['Close']\n",
    "amzn.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "uuid": "304b2f50-5b81-4e88-8fa7-ea69995cf2fe"
   },
   "outputs": [],
   "source": [
    "amzn['Log_Ret'] = np.log(amzn['Close'] / amzn['Close'].shift(1))\n",
    "amzn['Volatility'] = amzn['Log_Ret'].rolling(window=252).std() * np.sqrt(252)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "uuid": "b4e61939-c7fe-4a1e-a8c9-6fd755edcf86"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11238c198>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "amzn[['Close', 'Volatility']].plot(subplots=True, color='blue',\n",
    "                                   figsize=(8, 6), grid=True);\n",
    "# tag: amzn_vola\n",
    "# title: Amazon closing prices and yearly volatility"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Paradigm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "uuid": "beca497d-4c20-4240-b003-4c79c26154be"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.3 s ± 60.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "loops = 2500000\n",
    "from math import *\n",
    "a = range(1, loops)\n",
    "def f(x):\n",
    "    return 3 * log(x) + cos(x) ** 2\n",
    "%timeit r = [f(x) for x in a]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "uuid": "931fd1fc-cc54-4045-802f-acb8f094a23f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "103 ms ± 6.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "a = np.arange(1, loops)\n",
    "%timeit r = 3 * np.log(a) + np.cos(a) ** 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "uuid": "8d1602b3-a490-4d1a-97d9-112825d86185"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "45.4 ms ± 4.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "import numexpr as ne\n",
    "ne.set_num_threads(1)\n",
    "f = '3 * log(a) + cos(a) ** 2'\n",
    "%timeit r = ne.evaluate(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "uuid": "6994f16a-1802-4abe-851d-a48e0ead154d"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "26.1 ms ± 3.57 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "ne.set_num_threads(4)\n",
    "%timeit r = ne.evaluate(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>\n",
    "\n",
    "<a href=\"http://tpq.io\" target=\"_blank\">http://tpq.io</a> | <a href=\"http://twitter.com/dyjh\" target=\"_blank\">@dyjh</a> | <a href=\"mailto:training@tpq.io\">training@tpq.io</a>\n",
    "\n",
    "**Quant Platform** |\n",
    "<a href=\"http://quant-platform.com\">http://quant-platform.com</a>\n",
    "\n",
    "**Python for Finance** |\n",
    "<a href=\"http://python-for-finance.com\" target=\"_blank\">Python for Finance @ O'Reilly</a>\n",
    "\n",
    "**Derivatives Analytics with Python** |\n",
    "<a href=\"http://derivatives-analytics-with-python.com\" target=\"_blank\">Derivatives Analytics @ Wiley Finance</a>\n",
    "\n",
    "**Listed Volatility and Variance Derivatives** |\n",
    "<a href=\"http://lvvd.tpq.io\" target=\"_blank\">Listed VV Derivatives @ Wiley Finance</a>\n",
    "\n",
    "**Python Training** |\n",
    "<a href=\"http://training.tpq.io\" target=\"_blank\">Python for Finance University Certificate</a>"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
